package com.test.liuhb.test.Gson;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.widget.TextView;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import com.test.liuhb.test.R;
import com.test.liuhb.test.entity.User;
import com.test.liuhb.test.entity.User2;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.util.Date;

/**
 * Created by liu.hb on 2018/2/22.
 */
//1.设置布局
@EActivity(R.layout.item_gsonlayout)
public class GsonTest2 extends Activity{
    //2.实例化控件
    @ViewById(R.id.textView)
    TextView tv;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        userTest();
        userTest1();
        GsonTest2();
    }
    //3.初始化控件显示
    @AfterViews
    void initViews() {
        // 初始化控件
        tv.setText("Gson使用指南（二）");
    }
    /**
     * Gson的流式反序列化
     * 一、手动方式=》》自动方式
     *   Gson.fromJson(Reader,Class);
         Gson.fromJson(String,Class);
         Gson.fromJson(Reader,Type);
         Gson.fromJson(String,Type);
     *手动的方式就是使用stream包下的JsonReader类来手动实现反序列化，和Android中使用pull解析XML是比较类似的。
     */
    public void userTest(){
        System.out.println("----------Gson的流式反序列化手动方式--------------");
        String json = "{\"name\":\"怪盗kidou\",\"age\":\"24\",\"emailAddress\":\"衡阳市石鼓区\"}";
        User user = new User("11",0,"aa");
        JsonReader reader = new JsonReader(new StringReader(json));
        try {
            reader.beginObject(); // throws IOException
            while (reader.hasNext()) {
                String s = reader.nextName();
                switch (s) {
                    case "name":
                        user.name = reader.nextString();
                        break;
                    case "age":
                        user.age = reader.nextInt(); //自动转换
                        break;
                    case "emailAddress":
                        user.emailAddress = reader.nextString();
                        break;
                    default:
                        break;
                }
            }
            reader.endObject(); // throws IOException
        }catch (IOException e)
        {
            e.printStackTrace();
        }
        System.out.println(user.name); // 怪盗kidou
        System.out.println(user.age); // 24
        System.out.println(user.emailAddress); // ikidou@example.com

    }
    /**
     * 二、Gson的流式序列化
     */
    public void userTest1(){
        //自动方式
        System.out.println("------------Gson的流式序列化自动方式----------");
        Gson gson = new Gson();
        User user = new User("怪盗kidou",24,"衡阳市解放大道");
        gson.toJson(user,System.out); // 写到控制台
        //手动方式
        System.out.println();
        System.out.println("------------Gson的流式序列化手动方式----------");
        JsonWriter writer = new JsonWriter(new OutputStreamWriter(System.out));
        try {
        writer.beginObject() // throws IOException
        .name("name").value("怪盗kidou")
        .name("age").value(24)
        .name("email").nullValue() //演示null
        .endObject(); // throws IOException
        writer.flush(); // throws IOException
        }catch (IOException e)
        {
            e.printStackTrace();
        }
        // {"name":"怪盗kidou","age":24,"email":null}

    }

    /**
     * 三、 使用GsonBuilder导出null值、格式化输出、日期时间
     * JSON字符串数组，List集合
     */
    public void GsonTest2(){
        Gson gson = new GsonBuilder() //序列化null
        .serializeNulls() // 设置日期时间格式，另有2个重载方法 // 在序列化和反序化时均生效
        .setDateFormat("yyyyMMdd") // 禁此序列化内部类
        .disableInnerClassSerialization() //生成不可执行的Json（多了 )]}' 这4个字符）
        .generateNonExecutableJson() //禁止转义html标签
        .disableHtmlEscaping() //格式化输出
        .setPrettyPrinting() .create();


        User2 user2 = new User2("怪盗kidou", 24,null,new Date());
        String json = "{\"name\":\"怪盗kidou\",\"age\":24,\"email\":null,\"date\": \"20180305\"}";
        System.out.println("------------使用GsonBuilder导出null值、格式化输出、日期时间----------");

        User2 user3 = gson.fromJson(json, User2.class);
        System.out.println(user3.date+"-----aaa----------------"); //{"name":"怪盗kidou","age":24,"email":null,"date": "2018-03-05"}

    }


}
